package com.ftg.learn.chapter01;

/**
 * -
 *
 * @author kangjx
 * @version 1.0
 * @date 2023/12/14 上午10:54
 */
public class Upjava {

    public static void main(String[] args) {
        System.out.println("hello world");

//        事务 : 一系列的对数据库进行的计算指令，如果有一条指令执行失败，则全部回滚（失败），如果全部成功，则提交。
//          : 多个sql语句
//           查询 :
//           锁 ： 读锁 共享锁 排他锁  写锁
//           mysql 悲观锁(默认) : 慢  insert update delete 写锁 排他锁
//             行锁  表锁 
//        update user set name = 'kangjx' where id = 1;
//        命中 行锁
//        未命中  无锁
//        update user set name = 'kangjx';
//        表锁
////           脏数据 (脏读、幻读、重复读)
//            数据默认对单条sql insert update delete 上事务
//数据落盘(硬盘)
//        set autocommit = off;
//        insert into user(id) values(1);
//        insert into user(id) values(1);
//
//        rollback;
//        commit
//
//                select * from student where id = 1 for update;

//            :要么全成功，要么全失败.
//            :失败要回流，成功要提交
//        事务： 四个特征  ACID 原子性 一致性 隔离性 持久性
//        事务的四个特性：
//        原子性： 事务是最小的执行单位，由一系列的sql语句组成，如果其中一条sql语句执行失败，则全部回滚（失败），如果全部成功，则提交。
//        一致性： 事务执行前后，数据库的状态是一致的。
//        隔离性： 事务在执行过程中，不受其他事务的影响。
//
//        传播机制 ： 事务的传播机制是指一个事务在另一个事务中执行时，如果该事务的执行结果影响到另一个事务，那么该事务的执行结果对另一个事务来说是可见的。
//        事务的传播机制有四种：
//        读未提交（read uncommitted）： 一个事务可以读取另一个事务未提交的数据。
//        读已提交（read committed）： 一个事务只能读取另一个事务已经提交的数据。
//        可重复读（repeatable read）： 一个事务在执行过程中，可以多次读取同一数据，但是每次读取的数据都是事务开始时的数据，不能读取其他事务未提交的数据。
//        串行化（serializable）： 事务串行执行，一个事务的执行顺序按照其提交的顺序依次

//        2019 alibaba
//
//            库存量为 2
//
//            如何在代码级别上解决 ，永远不会卖给第三个人.串行化(慢)  100亿 (3分钟)
//
//            业务角度： 乐观锁 (CAS理论) compare and swap(交换)
//
//            id name  ... number(库存) version(版本)
//            1  方便面      2           10001
//
//
//            //并行 同一秒
//        if (number > 0) {
//            number -= 1;
//            //version = 10001
//            update user set number =#{number},version=version+1 where id =? and version = #{version};
//            //version 10002
//        }
//
//        if (number > 0) {
//            number -= 1;
//            //version = 10001
//            update user set number =#{number},version=version+1 where id =? and version = #{version};
//        }
//
//        if (number > 0) {
//            number -= 1;
//            //version = 10001
//            update user set number =#{number},version=version+1 where id =? and version = #{version};
//        }

        //框架 : java(设计模式 反射....) mysql


    }

}
